package rabbitmq.simple;

import rabbitmq.utils.ConnectionUtil;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * rabbitmq的消费者
 */
public class ConsumerWorkQueue1 {
    public static void main(String[] args) throws Exception {
        //获取连接
        Connection connection = ConnectionUtil.getConnection();

        //创建频道
        Channel channel = connection.createChannel();
        /**
         * 声明队列
         * 参数1：队列名称
         * 参数2：是否定义持久化队列
         * 参数3：是否独占本次连接
         * 参数4：是否在不使用的时候自动删除队列
         * 参数5：队列其它参数
         */
        channel.queueDeclare(Producer.QUEUE_NAME,true,false,false,null);

        //创建消费者并设置消息处理
        DefaultConsumer consumer = new DefaultConsumer(channel){
            /*
            是一个回调方法，当收到信息后，自动执行
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws UnsupportedEncodingException {
                try {
                    //路由Key
                    System.out.println("路由key为："+envelope.getRoutingKey());
                    //交换机
                    System.out.println("交换机为："+envelope.getExchange());
                    //消息id
                    System.out.println("消息id为："+envelope.getDeliveryTag());
                    //收到的消息
                    System.out.println("收到的消息："+ new String(body,"utf-8"));
                    Thread.sleep(1000);
                    //确认消息
                    channel.basicAck(envelope.getDeliveryTag(), false);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        /**
         * 监听消息
         * 参数1：队列名称
         * 参数2：是否自动确认，设置为true为表示消息接收到自动向mq回复接收到了，mq接收到回复会删除消息，设置为false则需要手动确认
         * 参数3：消息接收到后回调
         */
        channel.basicConsume(Producer.QUEUE_NAME,true,consumer);

        //资源释放
    /*    channel.close();
        connection.close();*/
    }
}
